我這次主要使用我的蘋果筆電來開發「自然語言處理的新聞意見提取應用」,本篇文章中的安裝及操作皆在此電腦環境下測試,簡略規格如下:
過去我在與同學一同撰寫 Python 專案時,發生過程式碼在其他人的電腦上無法正常運作尷尬情況,就很可能是因為有人沒留意下面事項所導致的:
如果你有類似的經驗,也許可以讀一下這篇文章分享。
相比於後續比對 Python 及套件的版本,從專案一開始就使用合適的工具來管理虛擬環境會來的更為省力,所以我選擇將這部分放在剛開始的 Day2 中分享。
在我撰寫文章的當下,在 https://www.python.org/downloads/ 頁面中顯示幾個可下載的主要 Python 版本如下:
Python version | Maintenance status | First released | End of support | Release schedule |
---|---|---|---|---|
3.10 | bugfix | 2021-10-04 | 2026-10 | PEP 619 |
3.9 | security | 2020-10-05 | 2025-10 | PEP 596 |
3.8 | security | 2019-10-14 | 2024-10 | PEP 569 |
3.7 | security | 2018-06-27 | 2023-06-27 | PEP 537 |
上表中比較需要注意的資訊有 Maintenance status 與 End of support 。
不同的 Python 版本可能有部分語法會不同、Standard Library 中的套件不同的情況,在選擇時也需要考量到後續你想安裝的套件是否支援此版本的 Python。
從上表中 3.9 與 3.8 是現階段常見的 Python 版本,考量到此專案後續會用到的 AWS(Amazon Web Services)服務中的 Lambda ,其現階段所支援最新的 Python 版本為 3.9,所以我決定在自己電腦建構 Python 3.9 環境,方便後續測試程式運行。
在 macos-12_3-release-notes 有提到原先的 Python 2.7 將被移除,考量到你的電腦可能沒有安裝想要使用的 Python 版本(在此篇文章中為 Python 3.9),接下來會介紹其中一種 Python 3.9 的安裝方法。
Python
Deprecations
Python 2.7 was removed from macOS in this update. Developers should use Python 3 or an alternative language instead. (39795874)
請注意 macOS Monterey 以外的作業系統可能不適用下面的安裝過程!
首先執行以下指令,先檢查 mac 已經安裝了哪些版本的 Python。
ls /usr/local/opt/
如果有出現 python@3.9
代表已經安裝 Python 3.9 ,如果沒有出現則可以透過下列步驟安裝:
brew install python@3.9
在 Python 3.9.14 文檔中的 12. 虛擬環境與套件 中有提到:
Python 應用程式通常會用到不在標準函式庫的套件和模組。應用程式有時候會需要某個特定版本的函式庫,因為這個應用程式可能需要某個特殊的臭蟲修正,或是這個應用程式是根據該函式庫特定版本的介面所撰寫。
這意味著不太可能安裝一套 Python 就可以滿足所有應用程式的要求。如果應用程式 A 需要一個特定的模組的 1.0 版,但另外一個應用程式 B 需要 2.0 版,那麼這整個需求不管安裝 1.0 或是 2.0 都會衝突,以致於應用程式無法使用。
解決方案是創建一個虛擬環境 (virtual environment),這是一個獨立的資料夾,並且裡面裝好了特定版本的 Python,以及一系列相關的套件。
不同的應用程式可以使用不同的虛擬環境。以前述中需要被解決的例子中,應用程式 A 能夠擁有它自己的虛擬環境,並且是裝好 1.0 版,然而應用程式 B 則可以是用另外一個有 2.0 版的虛擬環境。要是應用程式 B 需要某個函式庫被升級到 3.0 版,這並不會影響到應用程式 A 的環境。
雖然 Python 3.9 在 Standard Library 中有個名為 venv
的虛擬環境管理工具,不過因為 Pipenv
在使用上的方便特性,讓我決定使用 Pipenv
取代 venv
,用來管理本次專案的虛擬環境。下面是從 https://pipenv.pypa.io/en/latest/ 擷取出來的介紹:
The problems that
Pipenv
seeks to solve are multi-faceted:
- You no longer need to use
pip
andvirtualenv
separately. They work together.- Managing a
requirements.txt
file can be problematic, so Pipenv usesPipfile
andPipfile.lock
to separate abstract dependency declarations from the last tested combination.- Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
- Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.
- Give you insight into your dependency graph (e.g.
$ pipenv graph
).- Streamline development workflow by loading .env files.
詳細安裝可參考 https://pipenv.pypa.io/en/latest/install/#installing-pipenv
執行下面的指令,會將 pipenv 安裝至 home directory。
pip install --user pipenv
https://pipenv.pypa.io/en/latest/ 中有指出不推薦此方法,說明如下:
It’s possible to install Pipenv with Homebrew on MacOS, or with Linuxbrew on Linux systems. However, this is now discouraged, because updates to the brewed Python distribution will break Pipenv, and perhaps all virtual environments managed by it. You’ll then need to re-install Pipenv at least.
brew install pipenv
以下步驟使用 Pipenv 建立 Python 3.9 環境:
mkdir YOUR_PROJECT_NAME
cd YOUR_PROJECY_NAME
pipenv install --python /usr/local/opt/python@3.9/bin/python3
當中 /usr/local/opt/python@3.9/bin/python3
為上一步 Python 3.9 安裝時建立的路徑。
注意: 要使用上述指令來選擇虛擬環境的 Python 版本,而不是一般教學中使用的
pipenv --three
/YOUR_PROJECT_NAME/
),內容如下所示:python_version = "3.9"
)[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "3.9"
移除 Pipenv 建立的虛擬環境
在與 Pipfile 同一層的路徑下執行下面指令
pipenv --rm
來移除虛擬環境:
注意:下面
pipenv
開頭的指令需要在與 Pipfile 同一層的路徑下執行。
在撰寫 python 程式,時常會需要 import
一些會用到的相關套件,而這些套件很常需要透過 pip install 套件名稱
指令進行安裝,而在 Pippenv 建立的虛擬環境中則使用 pipenv install 套件名稱
將所需套件安裝到 Pippenv 建立的虛擬環境中。在安裝第一個套件後專案資料夾中會產生一個名為 Pipfile.lock 的檔案。
下面提供三個例子:
假設專案程式碼在「正常執行時」會需要用到套件 beautifulsoup4:
pipenv install beautifulsoup4
(pip install beautifulsoup4
假設專案程式碼在「開發」時會需要用到套件 yapf(Python 程式碼風格工具):
pipenv install yapf --dev
(pip install yapf
假設需要安裝 requirements.txt 中所記錄的所有套件
pipenv install --requirements requirements.txt
--dev
安裝至 [dev-packages] 類別,否則預設加在 [packages] 的類別下。移除安裝在 Pipenv 建立的虛擬環境中的套件
- 要移除的套件列在 Pipfile 中的 [packages] 類別下時,使用
pipenv uninstall 套件名稱
- 要移除的套件列在 Pipfile 中的 [dev-packages] 類別下時,使用
pipenv uninstall 套件名稱 --dev
- 移除所有在 Pipfile 中的 [packages] 類別下的套件時,使用
pipenv uninstall --all
- 移除所有在 Pipfile 中的 [dev-packages] 類別下的套件時,使用
pipenv uninstall --all-dev
注意:下面
pipenv
開頭的指令需要在與 Pipfile 同一層的路徑下執行。
假設你目前的專案是從別人的 github 上 clone 下來的,資料夾中只包含了 Pipfile 或是包含 Pipfile 和 Pipfile.lock,可依以下方式安裝所需套件:
只包含了 Pipfile:
pipenv install --python /usr/local/opt/python@3.9/bin/python3
安裝 Pipfile 內所有套件/usr/local/opt/python@3.9/bin/python3
為 Python 3.9 的路徑包含 Pipfile 和 Pipfile.lock:
pipenv sync --python /usr/local/opt/python@3.9/bin/python3
安裝所有在pipfile.lock中的套件/usr/local/opt/python@3.9/bin/python3
為 Python 3.9 的路徑執行指令 pipenv requirements > requirements.txt
,可將 Pipfile.lock 中所記錄的套件與版本輸出成 requirements.txt,requirements.txt 會包含套件「詳細版本」,例如:beautifulsoup4==4.11.1
。
注意:下面
pipenv
開頭的指令需要在與 Pipfile 同一層的路徑下執行。
有以下兩中方法可以在Pipenv 建立的虛擬環境中執行 Python:
假設要在虛擬環境下執行一個名為 mian.py 的 Python 檔案,在與 Pipfile 同一層的路徑下執行 pipenv run python main.py
,當中的 python main.py
與一般 Python 執行指令相同,以可以替換成其他想要在虛擬環境下執行的指令,例如 pip freeze
(pipenv run pip freeze
)。
首先執行 pipenv shell
會激活(active)Pipenv 建立的虛擬環境,後續在同一個終端視窗中所執行的指令,例如 python main.py
都會是在此虛擬環境下執行。若是執行 python --version
可確認當下用來執行的 Python 版本。
執行 exit
可以退出已在端視窗中激活(active)的虛擬環境。
使用 .env 中的環境變數
- 在 Pipfile 同一層的路徑下新增名為 .env 的檔案,並且在 .env 當中定義環境變數。之後再執行上面提到的方法一、二時,Pipenv 會自動載入 .env 中的環境變數到執行環境。
- 執行
pipenv --envs
可以輸出環境變數方便查看。
其他 Pipenv 指令用法可參考 Pipenv指令大全 或是官方文檔 Pipenv: Python Dev Workflow for Humans